"""
ProjectName:qq_tools_bot
FileName:merge_picture_txt.py
IdeaName:PyCharm
UserName:zhao
UserMail:2909552840@qq.com
UserHomepage:https://www.zywi.cn
CreationTime:2024/10/30 下午4:23
"""
import json
import os

from api import MessageApi
from models import MessageReport, Message, MessageType
from utils import print_red


class MergePictureText:
    """
    合图文功能
    """

    def __init__(self, message_report: MessageReport, message_api: MessageApi):
        """
        初始化函数
        :param message_report: 消息上报
        :param message_api: 消息API
        """
        super().__init__()
        self.message_report = message_report
        self.message_api = message_api
        # QQ
        user_id = self.message_report.user_id
        # 获取当前运行目录
        config_path = f'{os.getcwd()}\\data\\json\\{user_id}_merge_picture_text.json'
        self.start(config_path)
        self.record(config_path)
        self.end(config_path)
        self.clear(config_path)

    def start(self, config_path: str) -> None:
        """
        文图合并开始
        :param self:
        :return:
        """
        # 原始消息
        raw_message = self.message_report.raw_message
        if raw_message == '文图合并':
            # 判断文件是否存在
            if not os.path.isfile(config_path):
                # 不存在 创建目录
                os.makedirs(os.path.dirname(config_path), exist_ok=True)  # exist_ok=True 表示如果目录已存在则不抛出异常
                # 创建文件
                with open(config_path, 'w', encoding='utf-8') as file:
                    json_data = {
                        'message': []
                    }
                    file.write(json.dumps(json_data))
                    pass
            else:
                # 存在 删除文件
                os.remove(config_path)

    def record(self, config_path) -> None:
        """
        文图合并记录
        :return:
        """
        # 关键词
        keyword = ['文图合并', '文图合并结束', '文图合并清除']
        # 原始消息
        raw_message = self.message_report.raw_message
        # 判断是否包含关键词 否则返回
        if raw_message in keyword:
            return
        # 判断文件是否存在
        if os.path.isfile(config_path):
            # 读取文件
            with open(config_path, 'r', encoding='utf-8') as f:
                try:
                    data = json.load(f)  # 直接读取为字典
                except json.JSONDecodeError as e:
                    print_red(f"读取 JSON 文件时出错: {e}")
                    data = {}  # 如果读取失败，初始化为空字典
            # 消息
            message = self.message_report.message
            # 假设 model_dump_json() 返回的是 JSON 字符串
            message_list = [json.loads(item.model_dump_json()) for item in message]

            # 更新数据
            if 'message' in data:
                data['message'].extend(message_list)
            else:
                # 如果没有 'message' 键，初始化为当前消息列表
                data['message'] = message_list

            # 写入文件
            try:
                with open(config_path, 'w', encoding='utf-8') as f:
                    # 使用 json.dump() 直接写入
                    json.dump(data, f, ensure_ascii=False, indent=4)
            except IOError as e:
                print_red(f"写入文件时出错: {e}")

    def end(self, config_path) -> None:
        """
        文图合并结束
        :return:
        """
        # 原始消息
        raw_message = self.message_report.raw_message
        # 消息类型
        message_type = self.message_report.message_type
        # QQ号
        user_id = self.message_report.user_id
        # 群号
        group_id = self.message_report.group_id
        if raw_message == '文图合并结束':
            # 判断文件是否存在
            if os.path.isfile(config_path):
                # 读取文件
                with open(config_path, 'r', encoding='utf-8') as f:
                    try:
                        # 直接读取为字典
                        data = json.load(f)
                        message_list = [Message(**item) for item in data.get('message', [])]
                        # 发送消息
                        if message_type == MessageType.PRIVATE:  # 私聊
                            # 私聊
                            self.message_api.send_private_msg(user_id, message_list)
                        elif message_type == MessageType.GROUP:
                            # 群聊
                            self.message_api.send_group_msg(group_id, message_list)
                    except json.JSONDecodeError as e:
                        print_red(f"读取 JSON 文件时出错: {e}")
                # 删除文件
                os.remove(config_path)

    def clear(self, config_path) -> None:
        """
        清除缓存
        :return:
        """
        # 原始消息
        raw_message = self.message_report.raw_message
        if raw_message == '文图合并清除':
            # 判断文件是否存在
            if os.path.isfile(config_path):
                # 存在 删除文件
                os.remove(config_path)
        pass
